//
// System.Drawing.gdipStructs.cs
//
// Author: 
// Alexandre Pigolkine (pigolkine@gmx.de)
// Jordi Mas (jordi@ximian.com)
//
// Copyright (C) 2004, 2007 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace System.Drawing 
{
	[StructLayout(LayoutKind.Sequential)]
	internal struct GdiplusStartupInput
	{
			// internalted to silent compiler
			internal uint 		GdiplusVersion;
			internal IntPtr 		DebugEventCallback;
			internal int             SuppressBackgroundThread;
			internal int 		SuppressExternalCodecs;
    
	    	internal static GdiplusStartupInput MakeGdiplusStartupInput ()
	    	{
	    		GdiplusStartupInput result = new GdiplusStartupInput ();
	        	result.GdiplusVersion = 1;
	        	result.DebugEventCallback = IntPtr.Zero;
	        	result.SuppressBackgroundThread = 0;
	        	result.SuppressExternalCodecs = 0;
	        	return result;
	    	}    	
       	}
    
	[StructLayout(LayoutKind.Sequential)]
	internal struct GdiplusStartupOutput
	{
                internal IntPtr 	NotificationHook;
                internal IntPtr		NotificationUnhook;
                
	    	internal static GdiplusStartupOutput MakeGdiplusStartupOutput ()
	    	{
	    		GdiplusStartupOutput result = new GdiplusStartupOutput ();
	    		result.NotificationHook = result.NotificationUnhook = IntPtr.Zero;
	        	return result;
	    	}
	}
	
		
	[StructLayout(LayoutKind.Sequential)]
	internal struct GdiColorPalette
	{
   		internal int Flags;             // Palette flags
    		internal int Count;             // Number of color entries    				
    	}
    	
    	[StructLayout(LayoutKind.Sequential)]
    	internal struct  GdiColorMap 
    	{
    		internal int from;
    		internal int to;
	}

	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
	internal struct LOGFONT
	{
		internal int    lfHeight;
		internal uint   lfWidth;
		internal uint   lfEscapement;
		internal uint   lfOrientation;
		internal uint   lfWeight;
		internal byte   lfItalic;
		internal byte   lfUnderline;
		internal byte   lfStrikeOut;
		internal byte   lfCharSet;
		internal byte   lfOutPrecision;
		internal byte   lfClipPrecision;
		internal byte   lfQuality;
		internal byte   lfPitchAndFamily;
		[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
		internal string lfFaceName;
	}  
	
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
	internal struct GdipImageCodecInfo	/*Size 76 bytes*/
	{
    		internal Guid Clsid;    		
    		internal Guid  FormatID;    		
    		internal IntPtr CodecName;
    		internal IntPtr DllName;
    		internal IntPtr FormatDescription;
    		internal IntPtr FilenameExtension;
    		internal IntPtr MimeType;
		internal ImageCodecFlags Flags;
		internal int Version;
		internal int SigCount;
		internal int SigSize;
    		IntPtr SigPattern;
    		IntPtr SigMask;
    		
		internal static void MarshalTo (GdipImageCodecInfo gdipcodec, ImageCodecInfo codec)
		{	
			codec.CodecName = Marshal.PtrToStringUni (gdipcodec.CodecName);  			    			
			codec.DllName = Marshal.PtrToStringUni (gdipcodec.DllName);
			codec.FormatDescription = Marshal.PtrToStringUni (gdipcodec.FormatDescription);
			codec.FilenameExtension = Marshal.PtrToStringUni (gdipcodec.FilenameExtension);
			codec.MimeType = Marshal.PtrToStringUni (gdipcodec.MimeType);
			codec.Clsid = gdipcodec.Clsid;
			codec.FormatID = gdipcodec.FormatID;			
			codec.Flags = gdipcodec.Flags;
			codec.Version = gdipcodec.Version;
			codec.SignatureMasks = new byte [gdipcodec.SigCount][];
			codec.SignaturePatterns = new byte [gdipcodec.SigCount][];
			IntPtr p = gdipcodec.SigPattern;
			IntPtr m = gdipcodec.SigMask;
			for (int i=0; i < gdipcodec.SigCount; i++) {
				codec.SignatureMasks[i] = new byte [gdipcodec.SigSize];
				Marshal.Copy (m, codec.SignatureMasks[i], 0, gdipcodec.SigSize);
				m = new IntPtr (m.ToInt64 () + gdipcodec.SigSize);
				codec.SignaturePatterns[i] = new byte [gdipcodec.SigSize];
				Marshal.Copy (p, codec.SignaturePatterns[i], 0, gdipcodec.SigSize);
				p = new IntPtr (p.ToInt64 () + gdipcodec.SigSize);
			}
		}
	}

	[StructLayout(LayoutKind.Sequential)]
	internal struct GdipEncoderParameter {
		internal Guid guid;
		internal uint numberOfValues;
		internal EncoderParameterValueType type;
		internal IntPtr value;
	}

	[StructLayout(LayoutKind.Sequential)]
	internal struct GdipPropertyItem
	{
		internal int id;
		internal int len;
		internal short type;
		internal IntPtr value;

		internal static void MarshalTo (GdipPropertyItem gdipProp, PropertyItem prop)
		{	
			prop.Id = gdipProp.id;
			prop.Len = gdipProp.len;
			prop.Type = gdipProp.type;
			prop.Value = new byte [gdipProp.len];			
			Marshal.Copy (gdipProp.value, prop.Value, 0, gdipProp.len);
		}
	}

	[StructLayout(LayoutKind.Sequential)]
	internal struct IconInfo
	{
		int fIcon;
		public int xHotspot;
		public int yHotspot;
		public IntPtr hbmMask;
		public IntPtr hbmColor;

		public bool IsIcon {
			get { return (fIcon == 1); }
			set { fIcon = (value) ? 1 : 0; }
		}
	}

	[StructLayout(LayoutKind.Sequential)]
	internal struct XColor
	{
		public int		pixel;
		public ushort		red, green, blue;
		public sbyte		flags;
		public sbyte		pad;	
	}

	[StructLayout(LayoutKind.Sequential)]
	internal struct XVisualInfo
	{
		internal IntPtr visual;
		internal IntPtr visualid;
		internal int screen;
		internal uint depth;
		internal int klass;
		internal IntPtr red_mask;
		internal IntPtr green_mask;
		internal IntPtr blue_mask;
		internal int colormap_size;
		internal int bits_per_rgb;		
	}
}

